;P2.0 --------------- Enable LCD ;P2.1 --------------- RS LCD (0 Instrucción, 1 Dato) ;P3.4 --------------- ALTBTN (0 Si no está presionaldo alt, 1 si es que si) E EQU P2.0 RS EQU P2.1 ALTBTN EQU P3.4 DATAAV EQU P3.2 ORG 0000H LJMP INICIO ORG 0003H JMP TECLADO ORG 0013H JMP SEND ;NUDES ORG 0040H INICIO: MOV TMOD,#21H ; MODO 0 TMP 1 MOV IE,#85H ; HABILITA INTERRUPCIÓN EXT0 MOV SCON,#40H MOV TH1,#0FDH MOV TL1,#-3D SETB TR1 ACALL INIT ; LLAMA A INICIALIZAR LCD ACALL EQUIPO9 ; PRESENTACIÓN DEL EQUIPO MOV P1,#0H ; PUERTO 1 EN 0 DESPUES DE EQUIPO9 MOV R5,#0H ; CONTADOR DE CARACTERES EN LCD EN 0 MOV R6,#0H ; CONTADOR DE DOS NUMEROS EN ALT EN 0 MOV R0,#0H ; VARIABLE DONDE SE ALMACENA DATO A IMPRIMIR EN 0 MOV R4,#60H MOV R2,#60H MOV R3,#60H MOV R1,#40H //////////////////////////////////////////////////////////////////////////////////////////// ; TABLA DE VALORES DE ASCII A HEXADECIMAL //////////////////////////////////////////////////////////////////////////////////////////// MOV 30H, #48D ;1 MOV 31H, #49D ;2 MOV 32H, #50D ;3 MOV 33H, #51D ;A MOV 34H, #52D ;4 MOV 35H, #53D ;5 MOV 36H, #54D ;6 MOV 37H, #55D ;B MOV 38H, #56D ;7 MOV 39H, #57D ;8 MOV 3AH, #65D ;9 MOV 3BH, #66D ;C MOV 3CH, #67D ;F MOV 3DH, #68D ;0 MOV 3EH, #69D ;E MOV 3FH, #70D ;D SJMP $ INIT: ACALL WAIT ; TIEMPO DE ESPERA TÍPICO MOV A, #38H ; 2 LÍNEAS, MATRÍZ DE 5*8 ACALL MANDAR ; ENVÍA LA INSTRUCCIÓN A LA LCD MOV A, #38H ; 2 LÍNEAS, MATRÍZ DE 5*8 ACALL MANDAR ; ENVÍA LA INSTRUCCIÓN A LA LCD MOV A, #38H ; 2 LÍNEAS, MATRÍZ DE 5*8 ACALL MANDAR ; ENVÍA LA INSTRUCCIÓN A LA LCD REINICIO: MOV A, #01H ; LIMPIA LA LCD ACALL MANDAR ; ENVÍA LA INSTRUCCIÓN A LA LCD MOV A, #0FH ; DISPLAY, CURSOR Y PARPADEO PRENDIDOS ACALL MANDAR ; ENVÍA LA INSTRUCCIÓN A LA LCD MOV A, #80H ; CURSOR LÍNEA 1, POSICIÓN 1 (DDRAM DIRECCIÓN EN 0) ACALL MANDAR ; ENVÍA LA INSTRUCCIÓN A LA LCD RET ; RETORNA A DONDE SE LLAMÓ ///////////////////////////////////////////////////////////////////////////////////////////// WAIT: MOV TL0, #0B6H ; PARTE INFERIOR (057 PARA 25ms) MOV TH0, #03CH ; PARTE SUPERIOR (09E PARA 25ms SETB TR0 ; INICIALIZA EN 1 PARA INICIAR CONTEO JNB TF0,$ ; 50ms CLR TF0 ; LIMPIA BANDERA DE DESBORDE RET ; RETORNA A DONDE SE LLAMÓ //////////////////////////////////////////////////////////////////////////////////////////// MANDAR: CLR RS ; RS MODO INSTRUCCIÓN ACALL WAIT ; TIEMPO DE ESPERA TÍPICO CLR E ; PREPARANDO EL... ACALL WAIT ; TIEMPO DE ESPERA TÍPICO SETB E ; ...ENABLE ACALL WAIT ; TIEMPO DE ESPERA TÍPICO MOV P1, A ; ACUMILADOR A PUERTO 1 (LCD) ACALL WAIT ; TIEMPO DE ESPERA TÍPICO CLR E ; FLANCO DE BAJADA ENABLE (MANDA INSTRUCCIÓN) ACALL WAIT ; ESPERA TÍPICA RET ; RETORNA A DONDE SE LLAMÓ //////////////////////////////////////////////////////////////////////////////////////////// ESCRIBE: SETB RS ; RS EN MODO DE DATO ACALL WAIT ; TIEMPO DE ESPERA TÍPICO CLR E ; PREPARANDO EL... ACALL WAIT ; TIEMPO DE ESPERA TÍPICO SETB E ; ...ENABLE ACALL WAIT ; ESPERA TÍPICA MOV P1, A ; ACUMULADOR A PUERTO 1 (LCD) ACALL WAIT ; ESPERA TÍPICA CLR E ; FLANCO DE BAJADA ENABLE (MANDA INSTRUCCIÓN) ACALL WAIT ; ESPERA TÍPICA RET ; RETORNA A DONDE SE LLAMÓ //////////////////////////////////////////////////////////////////////////////////////////// EQUIPO9: MOV A,#69D ; E ACALL ESCRIBE ; ESCRIBE EN LCD MOV A,#81D ; Q ACALL ESCRIBE ; ESCRIBE EN LCD MOV A,#85D ; U ACALL ESCRIBE ; ESCRIBE EN LCD MOV A,#73D ; I ACALL ESCRIBE ; ESCRIBE EN LCD MOV A,#80D ; P ACALL ESCRIBE ; ESCRIBE EN LCD MOV A,#79D ; O ACALL ESCRIBE ; ESCRIBE EN LCD MOV A,#32D ; " " ACALL ESCRIBE ; ESCRIBE EN LCD MOV A,#57D ; 9 ACALL ESCRIBE ; ESCRIBE EN LCD MOV R7,#20D ; REPETICIONES DE 50ms LGK: MOV TL0, #0H ; PARTE INFERIOR MOV TH0, #0H ; PARTE SUPERIOR SETB TR0 ; INICIALIZA EN 1 PARA INICIAR CONTEO JNB TF0,$ ; 50ms CLR TF0 ; LIMPIA BANDERA DESBORDAMIENTO DJNZ R7, LGK ; EJECUTA 20 VECES ACALL REINICIO ; REINICIA PANTALLA RET ; RETORNA A DONDE SE LLAMÓ ///////////////////////////////////////////////////////////////////////////////////////////// TECLADO: CJNE R5,#10H,PLLENA ; COMPARA QUE LA PRIMERIA LÍNEA NO ESTE LLENA MOV A,#0C0H ; SI SE LLENA SE CAMBIA A LA SIGUIENTE LÍNEA ACALL MANDAR ; MANDA INSTRUCCIÓN A LCD PLLENA: CJNE R5,#20H,ELCD ; COMPARA QUE LA SEGUNDA LÍNEA NO ESTE LLENA MOV A,#01H ; CUANDO ESTA LLENA BORRA TODO ACALL MANDAR ; MANDA INSTRUCCIÓN A LCD MOV R5,#0H ; LIMPIA CONTADOR DE CARACTERES RETI ; SALE DE LA INTERRUPCIÓN DEL TECLADO ///////////////////////////////////////////////////////////////////////////////////////////// ELCD: JB ALTBTN,ALT ; VERIFICA QUE NO ESTÉ PRESIONADO EL PUSHBTN ALT MOV A,P0 ; MUEVE DATOS DEL TECLADO AL ACUMULADOR ADD A,#30H ; LO POSICIONA EN SU DECODIFICACIÓN CORRESPONDIENTE MOV R0,A ; GUARDA ACUMULADOR EN R0 PARA USARLO COMO APUNTADOR MOV A,@R0 ; APUNTA AL VALOR EN LA DIRECCION DONDE ESTÁ R0 ACALL TLCD ; LLAMA A TECLADO LCD (TLCD) MOV @R1,A INC R1 RETI ; SALE DE LA INTERRUPCIÓN DEL TECLADO ///////////////////////////////////////////////////////////////////////////////////////////// TLCD: SETB RS ; RS EN MODO DE DATO ACALL WAIT ; ESPERA TÍPICA CLR E ; PREPARANDO EL... ACALL WAIT ; ESPERA TÍPICA SETB E ; ...ENABLE ACALL WAIT ; ESPERA TÍPICA MOV P1,A ; ACUMULADOR A PUERTO 1 (LCD) ACALL WAIT ; ESPERA TÍPICA CLR E ; FLANCO DE BAJADA ENABLE (MANDA INSTRUCCIÓN) ACALL WAIT ; ESPERA TÍPICA CLR RS ; RS EN MODO INSTRUCCIÓN ACALL WAIT ; ESPERA TÍPICA INC R5 ; INCREMENTA CONTADOR DE CARACTERES RET ; RETORNA A DONDE SE LLAMÓ ///////////////////////////////////////////////////////////////////////////////////////////// ALT: JNB DATAAV,ALT MOV A,P0 ; MUEVE DATOS DEL TECLADO AL ACUMULADOR CJNE R6,#01H,PD ; MANDA A RUTINA PARA GUARDAR LOS DOS VALORES PRESIONADOS ADD A,B ; SUMA PRIMER VALOR (PARTE ALTA) CON SEGUNDO (PARTE BAJA) MOV R6,#0H ; PONE EN 0 EL COMPARADOR ACALL TLCD ; LLAMA A TECLADO LCD (TLCD) MOV @R1,A INC R1 RETI ; SALE DE LA INTERRUPCIÓN DEL TECLADO ///////////////////////////////////////////////////////////////////////////////////////////// PD: SWAP A ; MANDA LA PARTE BAJA DE "A" A LA PARTE ALTA MOV B,A ; MUEVE "A" A LA VARIABLE "B" INC R6 ; PONE EN 1 EL COMPARADOR RETI ; SALE DE LA INTERRUPCIÓN DEL TECLADO ////////////////////////////////////////////////////////////////////////////////////////////// SEND: MOV A,R1 SUBB A,#40H JZ SALIR MOV R0,#40H MOV 60H,A SETB TR1 SER: MOV SBUF,@R0 ACALL WAIT JNB TI,$ ACALL WAIT CLR TI ACALL WAIT INC R0 DJNZ 60H,SER CLR TR1 MOV R1,#40H ACALL REINICIO SALIR: RETI //////////////////////////////////////////////////////////////////////////////////////////////// END